#include "jsonhelper.h"

using namespace Moolink;

JsonHelper::JsonHelper()
{

}
QVariantMap JsonHelper::getObject(QString json)
{
    //QString json("{\"name\":\"scorpio\", \"year\":2016, \"array\":[30, \"hello\", true]}");
    //json("{\"username\":\"张三\",data:[{\"address\":\"福建厦门\"},{\"address\":\"福建福州\"}]}");
    QVariantMap jsdata;
    jsdata.clear();
//    jsdata.insert("qn",object.QN);
//    jsdata.insert("cpData",object.CP);
//    jsdata.insert("dataTimeSec",station.currTimeSec);
    QJsonParseError jsonerror;
    QJsonDocument doc = QJsonDocument::fromJson(json.toLatin1(), &jsonerror);
    if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError)
    {
        if(doc.isObject())
        {
            QJsonObject object = doc.object();
            QStringList list = object.keys();
//            for(int i = 0; i < list.count(); i++)
//            {
//                qDebug() << list.at(i);
//            }
            QJsonObject::iterator it = object.begin();
            while(it != object.end())
            {
                switch(it.value().type())
                {
                    case QJsonValue::String:
                    {
    //                    qDebug() << "Type is string";
    //                    QJsonArray sub = it.value().toArray();
    //                    qDebug() << it.key() << "=" << it.value().toString();
                        jsdata.insert(it.key(),it.value().toString());
                        break;
                    }
    //                case QJsonValue::Array:
    //                {
    //                    qDebug() << "Type is Array";
    //                    qDebug() << it.key() << "=" << it.value().toArray();
    //                    QJsonArray sub = it.value().toArray();
    //                    qDebug() << "index 1:" << sub.at(0).toDouble();
    //                    qDebug() << "index 2:" << sub.at(1).toString();
    //                    qDebug() << "index 3:" << sub.at(2).toBool();
    //                    break;
    //                }
                    case QJsonValue::Bool:
                    {
    //                    qDebug() << "Type is Bool";
    //                    qDebug() << it.key() << "=" << it.value().toBool();
                        jsdata.insert(it.key(),it.value().toBool());
                        break;
                    }
                    case QJsonValue::Double:
                    {
    //                    qDebug() << "Type is Double";
    //                    qDebug() << it.key() << "=" << it.value().toDouble();
                        jsdata.insert(it.key(),it.value().toDouble());
                        break;
                    }
                    case QJsonValue::Object:
                    {
                        qDebug() << "Type is Object";
                        qDebug() << it.key() << "=" << it.value().toObject();
                        break;
                    }
                    case QJsonValue::Null:
                    {
                        qDebug() << "Type is Null";
                        qDebug() << it.key() << "= NULL" ;
                        break;
                    }
                    case QJsonValue::Undefined:
                    {
                        qDebug() << "Type is Undefined";
                        break;
                    }
                }
                it++;
            }
        }
    }

    return jsdata;
}

void JsonHelper::getObject()
{
    QString json("{\"username\":\"张三\",\"data\":[{\"address\":\"福建厦门\"},{\"address\":\"福建福州\"}]}");//"{\"name\":\"scorpio\", \"year\":2016, \"array\":[30, \"hello\", true]}");
    QJsonParseError jsonerror;
    QJsonDocument doc = QJsonDocument::fromJson(json.toLatin1(), &jsonerror);
    if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError)
    {
        if(doc.isObject())
        {
            QJsonObject object = doc.object();
            QStringList list = object.keys();
            for(int i = 0; i < list.count(); i++)
            {
                qDebug() << list.at(i);
            }
            QJsonObject::iterator it = object.begin();
            while(it != object.end())
            {
                switch(it.value().type())
                {
                case QJsonValue::String:
                {
                    qDebug() << "Type is string";
                    QJsonArray sub = it.value().toArray();
                    qDebug() << it.key() << "=" << it.value().toString();
                    break;
                }
                case QJsonValue::Array:
                {
                    qDebug() << "Type is Array";
                    qDebug() << it.key() << "=" << it.value().toArray();
                    QJsonArray sub = it.value().toArray();
                    qDebug() << "index 1:" << sub.at(0).toDouble();
                    qDebug() << "index 2:" << sub.at(1).toString();
                    qDebug() << "index 3:" << sub.at(2).toBool();
                    break;
                }
                case QJsonValue::Bool:
                {
                    qDebug() << "Type is Bool";
                    qDebug() << it.key() << "=" << it.value().toBool();
                    break;
                }
                case QJsonValue::Double:
                {
                    qDebug() << "Type is Double";
                    qDebug() << it.key() << "=" << it.value().toDouble();
                    break;
                }
                case QJsonValue::Object:
                {
                    qDebug() << "Type is Object";
                    qDebug() << it.key() << "=" << it.value().toObject();
                    break;
                }
                case QJsonValue::Null:
                {
                    qDebug() << "Type is Null";
                    qDebug() << it.key() << "= NULL" ;
                    break;
                }
                case QJsonValue::Undefined:
                {
                    qDebug() << "Type is Undefined";
                    break;
                }
                }
                it++;
            }
        }
    }
    else
    {
         if(doc.isNull()) qDebug() << "doc.isNull()";
         if(jsonerror.error != QJsonParseError::NoError) qDebug() <<"jsonerror:"<< jsonerror.error;
    }

}

QString JsonHelper::getJson(QVariant object)
{

    //转换为QJsonDocument
    QJsonDocument doc = QJsonDocument::fromVariant(QVariant(object));
    //转换为QString
    QString strdoc = doc.toJson(QJsonDocument::Compact);
//    //转换为QByteArray
//    QByteArray byteArray = strdoc.toUtf8();

//    QString JsonStr = byteArray;
    //return strJson(byteArray);
    return strdoc;
//    qDebug() << "strdoc:" << strdoc;
//    qDebug() << "bytearr:" << bytearr;
}



QString JsonHelper::getJson(QJsonObject object)
{
    // 构建 Json 文档
    QJsonDocument document;
    document.setObject(object);
    //QByteArray byteArray = document.toJson(QJsonDocument::Compact);
    QString JsonStr = document.toJson(QJsonDocument::Compact);;
    //return strJson(byteArray);
    return JsonStr;
}

QString JsonHelper::getJson(QJsonDocument document)
{
    // 构建 Json 文档
    QByteArray byteArray = document.toJson(QJsonDocument::Compact);
    QString JsonStr = byteArray;
    //return strJson(byteArray);
    return JsonStr;
}


QString JsonHelper::getJson()//QJsonObject object)
{
// 构建 Json 数组 - Version
    QJsonArray versionArray;
    versionArray.append(4.8);
    versionArray.append(5.2);
    versionArray.append(5.7);

    // 构建 Json 对象 - Page
    QJsonObject pageObject;
    pageObject.insert("Home", "https://www.qt.io/");
    pageObject.insert("Download", "https://www.qt.io/download/");
    pageObject.insert("Developers", "https://www.qt.io/developers/");

    // 构建 Json 对象
    QJsonObject json;
    json.insert("Name", "Qt");
    json.insert("Company", "Digia");
    json.insert("From", 1991);
    json.insert("Version", QJsonValue(versionArray));
    json.insert("Page", QJsonValue(pageObject));

    // 构建 Json 文档
    QJsonDocument document;
    document.setObject(json);
    QByteArray byteArray = document.toJson(QJsonDocument::Compact);
    QString JsonStr = byteArray;
    //return strJson(byteArray);
    return JsonStr;
}

//        //解析JSON
//    QJsonParseError jsonError;
//    QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);
//    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
//    {
//        if (doucment.isObject())
//        {
//            QJsonObject object = doucment.object();
//            if (object.contains("Name"))
//            {
//                QJsonValue value = object.value("Name");
//                if (value.isString())
//                {
//                    QString strName = value.toString();
//                    qDebug() << "Name : " << strName;
//                }
//            }
//            if (object.contains("Company"))
//            {
//                QJsonValue value = object.value("Company");
//                if (value.isString())
//                {
//                    QString strCompany = value.toString();
//                    qDebug() << "Company : " << strCompany;
//                }
//            }
//            if (object.contains("From"))
//            {
//                QJsonValue value = object.value("From");
//                if (value.isDouble())
//                {
//                    int nFrom = value.toVariant().toInt();
//                    qDebug() << "From : " << nFrom;
//                }
//            }
//            if (object.contains("Version"))
//            {
//                QJsonValue value = object.value("Version");
//                if (value.isArray())
//                {
//                    QJsonArray array = value.toArray();
//                    int nSize = array.size();
//                    for (int i = 0; i < nSize; ++i)
//                    {
//                        QJsonValue value = array.at(i);
//                        if (value.isDouble())
//                        {
//                            double dVersion = value.toDouble();
//                            qDebug() << "Version : " << dVersion;
//                        }
//                    }
//                }
//            }
//            if (object.contains("Page"))
//            {
//                QJsonValue value = object.value("Page");
//                if (value.isObject())
//                {
//                    QJsonObject obj = value.toObject();
//                    if (obj.contains("Home"))
//                    {
//                        QJsonValue value = obj.value("Home");
//                        if (value.isString())
//                        {
//                            QString strHome = value.toString();
//                            qDebug() << "Home : " << strHome;
//                        }
//                    }
//                    if (obj.contains("Download"))
//                    {
//                        QJsonValue value = obj.value("Download");
//                        if (value.isString())
//                        {
//                            QString strDownload = value.toString();
//                            qDebug() << "Download : " << strDownload;
//                        }
//                    }
//                    if (obj.contains("Developers"))
//                    {
//                        QJsonValue value = obj.value("Developers");
//                        if (value.isString())
//                        {
//                            QString strDevelopers = value.toString();
//                            qDebug() << "Developers : " << strDevelopers;
//                        }
//                    }
//                }
//            }
//        }
//    }
